package com.houhanzhi.controller;


import com.houhanzhi.response.JsonData;
import com.houhanzhi.service.DomainService;
import com.houhanzhi.vo.DomainVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;


import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.web.bind.annotation.*;

import java.util.Arrays;
import java.util.List;

/**
 * <p>
 * 前端控制器
 * </p>
 *
 * @author houhanzhi
 * @since 2025-02-26
 */
@RestController
@Slf4j
@RequestMapping("/api/domain/v1")
public class DomainController {

    @Autowired
    private DomainService domainService;

    @Autowired
    private RedisTemplate<Object,Object> redisTemplate;

    /**
     * 查询全部可用域名
     *
     * @return
     */
    @GetMapping("/listAll")
    public JsonData listAll() {
        List<DomainVO> list = domainService.listAll();
        return JsonData.buildSuccess(list);
    }



    /**
     * 测试Lua脚本分布式重入锁+redis原生代码
     * @param code
     * @param accountNo
     * @return
     */
    @GetMapping("/testLua")
    public JsonData testLua(@RequestParam("code") String code, @RequestParam("accountNo") Long accountNo) {
        //key1是短链码，ARGV[1]是accountNo,ARGV[2]是过期时间(秒)
        String script = "if redis.call('EXISTS',KEYS[1])==0 then " +
                "redis.call('set',KEYS[1],ARGV[1]); " + // 加锁成功
                "redis.call('expire',KEYS[1],ARGV[2]); " + // 设置过期时间
                "return 1;" +
                " elseif redis.call('get',KEYS[1]) == ARGV[1] then " +
                "return 2;" + // 同一用户，同一业务线，不同服务，加锁成功，可重入
                " else return 0; " + // 加锁失败
                "end;";

        Long result = redisTemplate.execute(new DefaultRedisScript<>(script, Long.class), Arrays.asList(code), accountNo, "100");
        return JsonData.buildSuccess(result);

    }


}

